package com.zxl.designpattern.structure.facade;

/**
 * @author zxl
 * @version 1.0
 * @description 模拟游戏启动门面
 * 游戏启动过程中，需要启动游戏客户端、反作弊系统和语音聊天系统，
 * 而这些子系统之间存在一定的依赖关系，门面模式可以将这些子系统的启动过程封装起来，
 * 提供一个统一的接口供客户端调用，简化了客户端的调用过程。
 * 同时，门面模式也可以将子系统的启动过程进行封装，
 * 使得客户端无需了解子系统的具体实现细节，提高了系统的可维护性和可扩展性。
 * 此外，门面模式还可以提供对子系统的访问控制，
 * 使得客户端只能访问门面提供的接口，而无法直接访问子系统，从而保护了子系统的安全性。
 * 总之，门面模式是一种非常有用的设计模式，
 * 可以将复杂的子系统启动过程封装起来，提供一个统一的接口供客户端调用，
 * @date 2025/6/1 14:22
 */
public class Test {
    public static void main(String[] args) {
        // 创建游戏客户端
        GameClient gameClient = new GameClient("地下城与勇士");
        // 创建游戏子系统
        AntiCheatSystem antiCheat = new AntiCheatSystem();
        TradingSystem tradingSystem = new TradingSystem();
        // 创建游戏启动门面
        GameLauncherFacade launcher = new GameLauncherFacade(gameClient, antiCheat, tradingSystem);
        // 使用门面启动游戏
        System.out.println("=== 启动游戏 ===");
        launcher.startGame();
        System.out.println("=== 关闭游戏 ===");
        // 使用门面关闭游戏
        launcher.quitGame();
        // Tomcat 中的 RequestFacade 类，从类名上看是使用的Facade模式，保护了私有成员变量request的安全性
        // 但这和标准的 Facade 模式还是有区别的，实际上各种设计模式的应用都没有那么标准，总是有其他模式的影子
        // 你甚至可以不认为这个类是门面模式，而是一种包装
    }
}